package reflect;

import java.io.File;
import java.net.URISyntaxException;

/**
 * 类对象用于获取相对路径
 * 1:获取类加载路径(项目中用过了)
 * 2:获取当前类的字节码文件所在的目录
 */
public class Test {
    public static void main(String[] args) throws URISyntaxException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //类加载路径:Test的字节码文件所在包的最上级的上一层
//        File dir = new File(
//                Test.class.getClassLoader().getResource(".").toURI()
//        );

        //当前类Test的字节码文件所在的目录
        File dir = new File(
                Test.class.getResource(".").toURI()
        );
        System.out.println(dir);//Test.class文件所在的目录（就是Test类所在的包）
        String packName = Test.class.getPackage().getName();
        System.out.println(packName);

        /*
            完成功能:
            实例化与当前Test类所在同一个包中的所有类(仅用无参构造器实例化即可)
         */
        //1获取与Test类所在同一个目录中的所有.class文件(java中字节码文件的名字就是其中类的名字)
        File[] subs = dir.listFiles(f->f.getName().endsWith(".class"));
        for(File sub : subs){
            String fileName = sub.getName();//获取字节码文件的名字
            //通过文件名获取类名
            String className = fileName.substring(0,fileName.indexOf("."));

            //加载类时的完全限定名(包名.类名)
            Class cls = Class.forName(packName+"."+className);
            Object o = cls.newInstance();
            System.out.println(o);
        }

    }
}
